home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / ix_startup.c < prev    next >
C/C++ Source or Header  |  1995-10-01  |  4KB  |  140 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *  Portions Copyright (C) 1994 Rafael W. Luebbert
  5.  *
  6.  *  This library is free software; you can redistribute it and/or
  7.  *  modify it under the terms of the GNU Library General Public
  8.  *  License as published by the Free Software Foundation; either
  9.  *  version 2 of the License, or (at your option) any later version.
  10.  *
  11.  *  This library is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  *  Library General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU Library General Public
  17.  *  License along with this library; if not, write to the Free
  18.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  *  $Id: ix_startup.c,v 1.5 1994/06/19 15:13:22 rluebbert Exp $
  21.  *
  22.  *  $Log: ix_startup.c,v $
  23.  *  Revision 1.5  1994/06/19  15:13:22  rluebbert
  24.  *  *** empty log message ***
  25.  *
  26.  *  Revision 1.3  1992/08/09  20:55:51  amiga
  27.  *  import sysbase
  28.  *
  29.  *  Revision 1.2  1992/07/04  19:18:21  mwild
  30.  *  remove SIGWINCH handler before returning
  31.  *
  32.  * Revision 1.1  1992/05/14  19:55:40  mwild
  33.  * Initial revision
  34.  *
  35.  */
  36.  
  37. #define KERNEL
  38. #include "ixemul.h"
  39. #include "kprintf.h"
  40.  
  41. extern struct ExecBase *SysBase;
  42. /* this just jumps right back into ix_startup() */
  43.  
  44.  
  45. /*
  46.  * Note: I kept the partition into startup and _main(), although in this
  47.  *       case, both functions could be done in one function, since this is
  48.  *       a library, and the user can't override _main anyway but globally...
  49.  */
  50.  
  51. int
  52. ix_startup (char *aline, int alen,
  53.         int expand, char *wb_default_window, u_int main, int *real_errno)
  54. {
  55.   struct Process    *me        = (struct Process *) SysBase->ThisTask;
  56.   int            exit_val;
  57.   struct WBStartup    *wb_msg;
  58.   int            fd;
  59.   /*
  60.    * The following code to reset the fpu might not be necessary, BUT since
  61.    * a CLI shell doesn't spawn a new process when executing a command - it 
  62.    * insteads calls the command like a subroutine - it depends on the Shell
  63.    * whether the fpu is setup correctly. And I don't like to depend on any
  64.    * thing ;-)
  65.    */
  66.  
  67.   if (gotanfpu())
  68.     resetfpu();
  69.   /* first deal with WB messages, since those HAVE to be answered properly,
  70.    * even if we should fail later (memory, whatever..) */
  71.  
  72.   if (! me->pr_CLI)
  73.     {
  74.       /* we have been started by Workbench. Get the StartupMsg */
  75.       WaitPort (& me->pr_MsgPort);
  76.       wb_msg = (struct WBStartup *) GetMsg (& me->pr_MsgPort);
  77.       /* further processing in _main () */
  78.     }
  79.   else
  80.     {
  81.       /* for usage by sys_exit() for example */
  82.       KPRINTF (("CLI command line '%s'\n", aline));
  83.       u.u_argline = aline;
  84.       u.u_arglinelen = alen;
  85.     }
  86.  
  87.  
  88.   u.u_expand_cmd_line = expand;
  89.   if (real_errno) u.u_errno = real_errno;
  90.   KPRINTF (("&errno = %lx\n", real_errno));
  91.  
  92.  
  93.   exit_val = _setjmp (u.u_jmp_buf);
  94.   if (! exit_val)
  95.     {
  96.       /* from now on it's safe to allow signals */
  97.       syscall (SYS_sigsetmask, 0);
  98.       /* the first time thru call the program */
  99.       KPRINTF (("calling __main()\n"));
  100.       exit_val = me->pr_CLI ? syscall (SYS__main, aline, alen, main)
  101.                 : syscall (SYS__main, wb_msg, wb_default_window, main);
  102.       KPRINTF (("exit_val = %ld\n", exit_val));
  103.     }
  104.   else
  105.     /* in this case we came from a longjmp-call */
  106.     {
  107.     exit_val --;
  108.     }
  109.   ix_remove_sigwinch ();
  110.  
  111.   /* had to move the closing of files out of ix_close(), as close() may 
  112.      actually wait for the last packet to arrive, and inside ix_close() we're
  113.      inside Forbid, and may thus never wait! */
  114.  
  115.   /* close all files */
  116.   for (fd = 0; fd < NOFILE; fd++) 
  117.     if (u.u_ofile[fd]) syscall (SYS_close, fd);
  118.  
  119.   /* if at all possible, free memory before entering Forbid ! (Semaphore
  120.      problems..) */
  121.   all_free ();
  122.   /* if started from workbench, Forbid(), since on reply WB will deallocate
  123.    * our task... */
  124.   if (! me->pr_CLI)
  125.     {
  126.       Forbid ();
  127.       ReplyMsg ((struct Message *) wb_msg);
  128.     }
  129.  
  130.   return exit_val;
  131. }
  132.  
  133. void
  134. _exit (int retcode)
  135. {
  136.   /* ignore all signals from now on */
  137.   syscall (SYS_sigsetmask, ~0);
  138.   _longjmp (u.u_jmp_buf, retcode + 1);
  139. }
  140.